 /*******************************************************************************
  * Copyright (c) 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.core.internal.registry;

 public class RegistryIndexChildren {

     static final int[] EMPTY_ARRAY = new int[0];

     private int[] children;

     public RegistryIndexChildren() {
         children = EMPTY_ARRAY;
     }

     public RegistryIndexChildren(int[] children) {
         this.children = children;
     }

     public int[] getChildren() {
         return children;
     }

     public int findChild(int id) {
         for (int i = 0; i < children.length; i++) {
             if (children[i] == id)
                 return i;
         }
         return -1;
     }

     public boolean unlinkChild(int id) {
         int index = findChild(id);
         if (index == -1)
             return false; // there is no such element

         // copy the array except one element at index
 int[] result = new int[children.length - 1];
         System.arraycopy(children, 0, result, 0, index);
         System.arraycopy(children, index + 1, result, index, children.length - index - 1);
         children = result;
         return true;
     }

     public boolean linkChild(int id) {
         if (children.length == 0) {
             children = new int[] {id};
             return true;
         }

         // add new element at the end
 int[] result = new int[children.length + 1];
         System.arraycopy(children, 0, result, 0, children.length);
         result[children.length] = id;
         children = result;
         return true;
     }

     public boolean linkChildren(int[] IDs) {
         if (children.length == 0) {
             children = IDs;
             return true;
         }
         int[] result = new int[children.length + IDs.length];
         System.arraycopy(children, 0, result, 0, children.length);
         System.arraycopy(IDs, 0, result, children.length, IDs.length);
         children = result;
         return true;
     }

     public boolean unlinkChildren(int[] IDs) {
         if (children.length == 0)
             return (IDs.length == 0);

         int size = children.length;
         for (int i = 0; i < IDs.length; i++) {
             int index = findChild(IDs[i]);
             if (index != -1) {
                 children[i] = -1;
                 size--;
             }
         }
         if (size == 0) {
             children = EMPTY_ARRAY;
             return true;
         }
         int[] result = new int[size];
         int pos = 0;
         for (int i = 0; i < children.length; i++) {
             if (children[i] == -1)
                 continue;
             result[pos] = children[i];
             pos++;
         }
         return true;
     }
 }

